package demo3;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

@Component
public class Person {
    /*
        @Autowired 自动装配注解
        该注解作用是希望让Spring容器来对这个属性进行初始化，将其管理的一个对象设置到该属性上
        需要注意，该属性必须是Spring容器管理的一个对象。
        那么Spring容器在初始化Person时，才会将Shirt对象设置到这个属性上。建立Person与
        Shirt的依赖关系。


        如果Spring容器在自动装配时抛出异常:NoUniqueBeanDefinitionException
        说明容器找到了多个子类，他们都实现了Clothes接口，无法确定应当将哪个对象设置到这里

        解决装配冲突:
        1:确保Clothes接口的实现类只有一个被Spring容器管理
        2:可以为多个Clothes的实现类在添加@Component注解时，通过注解参数为其定义组件名
          此时这里需要让Spring进行自动装配置，再添加注解@Qualifier,来通过组件名进行装配。

          例如:当前代码@Qualifier("summer")

          Spring容器创建时扫描demo3包，发现了两个实现了Clothes接口的类:
          @Component("summer")      <----可以匹配这里@Qualifier("summer")
          public class Shirt{...}

          @Component("winter")
          public class Sweater{...}

          此时容器会将Shirt实例装配到这里

     */
    @Autowired//自动装配
    @Qualifier("summer")
    private Clothes clothes;
//    private Shirt shirt;//Person需要使用shirt时，将其定义为一个属性
//    private Sweater sweater;//毛衣
    public void play(){
        /*
            当A类的某个方法逻辑中，调用了B类的功能，那么A类就与B类产生了"依赖关系"
            Person的play方法依赖Shirt的wear方法完成部分功能，因此Person类与
            Shirt类存在依赖关系。
         */
        //穿上衣服
//        Shirt shirt = new Shirt();//不要直接new，产生强耦合，后续可能导致代码修改
//        shirt.wear();
//        sweater.wear();
        clothes.wear();
        //出去玩
        System.out.println("出去玩!");
    }
}
